/*
 * @Descripttion: eslint配置文件
 * @version:
 * @Author: lhl
 * @Date: 2024-09-01 11:14:52
 * @LastEditors: lhl
 * @LastEditTime: 2024-09-13 11:59:37
 */
import globals from 'globals';
import pluginJs from '@eslint/js';
import tseslint from 'typescript-eslint';
import pluginVue from 'eslint-plugin-vue';

export default [
  {
    // 指定 ESLint 要检查的文件类型，包括 JS、MJS、CJS、TS 和 Vue 文件
    files: ['**/*.{js,mjs,cjs,ts,vue}']
  },
  // 为浏览器环境设置全局变量选项，允许代码中使用这些全局变量而不会触发 ESLint 警告
  {
    languageOptions: {
      // globals: globals.browser, 初始化的
      globals: {
        ...globals.browser,
        ...globals.es2020,
        ...globals.node,
        // 把第一次 .eslintrc-auto-import.json 生成的文件变量手动放入全局 v9 不支持 json 导入实验性功能不然报错
        // 解决自动引入 vue-router vue 还报错的ts问题
        Component: true,
        ComponentPublicInstance: true,
        ComputedRef: true,
        EffectScope: true,
        ExtractDefaultPropTypes: true,
        ExtractPropTypes: true,
        ExtractPublicPropTypes: true,
        InjectionKey: true,
        PropType: true,
        Ref: true,
        VNode: true,
        WritableComputedRef: true,
        computed: true,
        createApp: true,
        customRef: true,
        defineAsyncComponent: true,
        defineComponent: true,
        effectScope: true,
        getCurrentInstance: true,
        getCurrentScope: true,
        h: true,
        inject: true,
        isProxy: true,
        isReactive: true,
        isReadonly: true,
        isRef: true,
        markRaw: true,
        nextTick: true,
        onActivated: true,
        onBeforeMount: true,
        onBeforeRouteLeave: true,
        onBeforeRouteUpdate: true,
        onBeforeUnmount: true,
        onBeforeUpdate: true,
        onDeactivated: true,
        onErrorCaptured: true,
        onMounted: true,
        onRenderTracked: true,
        onRenderTriggered: true,
        onScopeDispose: true,
        onServerPrefetch: true,
        onUnmounted: true,
        onUpdated: true,
        provide: true,
        reactive: true,
        readonly: true,
        ref: true,
        resolveComponent: true,
        shallowReactive: true,
        shallowReadonly: true,
        shallowRef: true,
        toRaw: true,
        toRef: true,
        toRefs: true,
        toValue: true,
        triggerRef: true,
        unref: true,
        useAttrs: true,
        useCssModule: true,
        useCssVars: true,
        useLink: true,
        useRoute: true,
        useRouter: true,
        useSlots: true,
        watch: true,
        watchEffect: true,
        watchPostEffect: true,
        watchSyncEffect: true
      },
      ecmaVersion: 12, // 使用最新的 ECMAScript 语法
      sourceType: 'module' // 代码是 ECMAScript 模块
    }
  },
  // 使用 ESLint 官方推荐的 JavaScript 规则配置
  pluginJs.configs.recommended,
  // 使用 TypeScript ESLint 推荐的规则配置
  ...tseslint.configs.recommended,
  // 使用 Vue.js 插件提供的基本规则配置
  ...pluginVue.configs['flat/essential'],
  {
    // 针对 Vue 文件做特殊配置
    files: ['**/*.vue'],
    // 指定 TypeScript ESLint 解析器来解析 Vue 文件中的 `<script>` 块
    languageOptions: { parserOptions: { parser: tseslint.parser } }
  },
  {
    rules: {
      // 关闭组件名中多个单词的检查
      'vue/multi-word-component-names': 'off',
      // 关闭any类型的警告
      '@typescript-eslint/no-explicit-any': ['off'],
      // 禁用 no-duplicate-selectors 规则
      'no-duplicate-selectors': 'off',
      // 可配置空对象类型 如：RouteMeta
      '@typescript-eslint/no-empty-object-type': 'off'
    }
  },
  // 全局配置
  {
    ignores: ['scritps', 'node_modules', 'dist', '.idea', '.vscode', '.husky', '*.d.ts']
  }
];
